DB에서 특정 컬럼을 빠르게 찾기 위해 DB가 따로 만들어두는 정렬된 자료구조
내부 구조는 대부분 B-Tree(Balanced Tree)로 O(log N)으로 탐색 가능
생성방법
-- 직접 생성 CREATE INDEX idx_user_email ON users(email); -- PK는 자동 생성 CREATE TABLE users ( id SERIAL PRIMARY KEY, -- 자동으로 Index 생성됨 email VARCHAR(100) );
Index를 타지 못하는 경우
| 경우 | 예시 | 이유 |
|---|---|---|
| 앞에 % 붙은 LIKE | LIKE '%홍길동' |
시작점을 특정할 수 없음 |
| 컬럼에 연산 적용 | WHERE salary * 2 > 1000 |
정렬된 원본값과 다름 |
| 전체 조회 | SELECT * FROM users |
전부 읽어야 함 |
| NULL 비교 | WHERE col IS NULL |
Index에 NULL이 포함 안되는 경우 있음 |
모든 컬럼에 Index를 걸지 않는 이유
스키마 유연 (Json / 키-값 등)
관계 없이 독립 저장
일관성보단 가용성 우선
수평 확장(Scale-out)
Redis, MongoDB, Cassandra
대용량 트래픽, 빠른 읽기/쓰기, 유연한 구조가 필요할 때(캐시·로그·실시간 데이터 등) 사용
CREATE TABLE auction ( id SERIAL PRIMARY KEY, title VARCHAR(200) NOT NULL, status VARCHAR(20) CHECK (status IN ('OPEN','CLOSED')), seller_id INTEGER REFERENCES users(id) );
BEGIN; -- 트랜잭션 시작 UPDATE accounts SET balance = balance - 100000 WHERE id = 'A'; UPDATE accounts SET balance = balance + 100000 WHERE id = 'B'; COMMIT; -- 둘 다 성공하면 확정 -- 중간에 오류 → ROLLBACK 자동 처리
| 속성 | 설명 | 예시 |
|---|---|---|
| Atomicity(원자성) | 전부 성공 or 전부 실패, 중간 상태 없음 | 이체 중 오류 → 둘 다 취소 |
| Consistency(일관성) | 트랜잭션 전후로 DB 규칙 항상 유지 | 잔액이 음수가 되는 상황 방지 |
| Isolation(격리성) | 동시 트랜잭션이 서로 영향 안 줌 | 동시에 같은 좌석 예약 시 충돌 방지 |
| Durability(지속성) | 커밋된 데이터는 장애 나도 유지 | 서버 꺼져도 이체 결과 보존 |
JSON 타입 지원 강력
동시성 처리(MVCC) 우수
복잡한 쿼리 분석에 더 강함
MVCC란
In-Memory 기반 Key-Value 저장소
데이터를 디스크가 아닌 RAM에 저장해서 DB보다 읽기/쓰기가 압도적으로 빠름
서버가 꺼지면 데이터가 사라질 수 있음(영속성 옵션으로 보완 가능)
주요 사용 용도
| 용도 | 동작 방식 | 예시 |
|---|---|---|
| 캐시 | DB 조회 결과를 Redis에 저장 → 다음 요청은 DB 안 거치고 Redis에서 응답 | 상품 목록, 자주 조회되는 데이터 |
| 세션 | 로그인 세션 정보를 Redis에 저장 → 서버 여러 대여도 세션 공유 가능 | 로그인 상태 유지 |
| TTL | 저장 시 만료 시간 설정 → 시간 지나면 자동 삭제 | 세션 만료, 인증번호 유효 시간 |
캐시 전용 / 세션 전용으로 나누는 이유
-- 세션 저장 예시 (TTL 30분) SET session:userId:abc123 "user_data" EX 1800 -- 캐시 저장 예시 (TTL 5분) SET cache:product:list "product_json" EX 300